#include<iostream>
#include<unistd.h>
#include<signal.h>

using namespace std;



void PrintPending(sigset_t &pending)
{
    for(int signo = 1; signo <=31; signo++)
    {
        if(sigismember(&pending, signo))
            cout<<1;
        else
            cout<<0;
    }
    cout<<endl;
}


void handle(int signo)
{
    cout<<"catch a signo : "<<signo<<endl;
}


// int main()
// {
//     //如果我们将所有信号都屏蔽了，不坏之身？
//     //按道理肯定是不行的（有些还是不可被屏蔽的）
//     sigset_t bset, oset;
//     sigemptyset(&bset);
//     sigemptyset(&oset);
//     for(int i = 1; i<=31; i++)
//         sigaddset(&bset, i);
//     sigprocmask(SIG_SETMASK, &bset, &oset);

//     sigset_t pending;
//     while(true)
//     {
//         //获取
//         int n = sigpending(&pending);
//         //打印
//         if(n < 0) continue;
//         PrintPending(pending);
//         sleep(1);

//     }
//     return 0;
// }

int main()
{
    //对2号信号自定义捕捉，不然我们后面观察不到1->0
    signal(2, handle);

    //先对2号信号屏蔽
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset, 2);

    sigprocmask(SIG_SETMASK, &bset, &oset);

    //重复打印pending表
    sigset_t pending;
    int cnt = 1;
    while(true)
    {
        //获取
        int n = sigpending(&pending);
        //打印
        if(n < 0) continue;
        PrintPending(pending);
        sleep(1);
        cnt++;
        //解除2号信号屏蔽
        if(cnt == 20)
        {
            cout<<"unblock 2 signo"<<endl;
            sigprocmask(SIG_SETMASK, &oset, &oset);
        }
    }
    //发送二号信号

    return 0;
}